const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');

const downloadRoutes = require('./routes/download');
const {
  errorHandler,
  notFoundHandler,
  requestLogger
} = require('./middleware/validation');
const logger = require('./utils/logger');

/**
 * 解析命令行参数
 */
function parseCommandLineArgs() {
  const args = process.argv.slice(2);
  const config = {};

  for (let i = 0; i < args.length; i++) {
    const arg = args[i];

    // 端口参数
    if (arg === '-p' || arg === '--port') {
      const portValue = args[i + 1];
      if (portValue && !isNaN(portValue)) {
        config.port = parseInt(portValue);
        i++; // 跳过下一个参数（端口值）
      } else {
        console.error('❌ 端口参数无效，请提供有效的端口号');
        process.exit(1);
      }
    }
    // 主机参数
    else if (arg === '-h' || arg === '--host') {
      const hostValue = args[i + 1];
      if (hostValue) {
        config.host = hostValue;
        i++; // 跳过下一个参数（主机值）
      } else {
        console.error('❌ 主机参数无效，请提供有效的主机地址');
        process.exit(1);
      }
    }
    // 下载目录参数
    else if (arg === '-d' || arg === '--download-dir') {
      const dirValue = args[i + 1];
      if (dirValue) {
        config.downloadDir = dirValue;
        i++; // 跳过下一个参数（目录值）
      } else {
        console.error('❌ 下载目录参数无效，请提供有效的目录路径');
        process.exit(1);
      }
    }
    // Cookie参数
    else if (arg === '-c' || arg === '--cookie') {
      const cookieValue = args[i + 1];
      if (cookieValue) {
        config.cookie = cookieValue;
        i++; // 跳过下一个参数（Cookie值）
      } else {
        console.error('❌ Cookie参数无效，请提供有效的Cookie值');
        process.exit(1);
      }
    }
    // 帮助信息
    else if (arg === '--help' || arg === '-help') {
      console.log(`
📖 Download Service API 使用说明

用法: node app.js [选项]

选项:
  -p, --port <端口>        指定服务端口 (默认: 8870)
  -h, --host <主机>        指定服务主机 (默认: 127.0.0.1)
  -d, --download-dir <目录> 指定下载目录 (默认: ./storage/downloads)
  -c, --cookie <Cookie>    指定Z-Library Cookie
  --help                   显示帮助信息

环境变量:
  PORT                 服务端口
  HOST                 服务主机
  DOWNLOAD_DIR         下载目录路径
  ZLIB_COOKIE          Z-Library登录Cookie
  NODE_ENV             环境模式 (development/production)

示例:
  node app.js -p 9990                              # 在端口9990启动
  node app.js -p 8080 -h 0.0.0.0                  # 在所有接口的8080端口启动
  node app.js -d /custom/downloads -c "cookie..."  # 自定义下载目录和Cookie
  node app.js -p 9990 -d /tmp -c "remix_userkey=xxx"  # 完整参数组合
      `);
      process.exit(0);
    }
    // 未知参数
    else if (arg.startsWith('-')) {
      console.error(`❌ 未知参数: ${arg}`);
      console.error('使用 --help 查看可用选项');
      process.exit(1);
    }
  }

  return config;
}

// 解析命令行参数
const cmdArgs = parseCommandLineArgs();

// 创建Express应用
const app = express();

// 基础中间件
app.use(helmet()); // 安全头
app.use(cors()); // CORS支持
app.use(express.json({ limit: '10mb' })); // JSON解析
app.use(express.urlencoded({ extended: true })); // URL编码解析

// 请求日志
if (process.env.NODE_ENV === 'production') {
  app.use(morgan('combined'));
} else {
  app.use(requestLogger);
}

// 限流中间件
// const limiter = rateLimit({
//   windowMs: 15 * 60 * 1000, // 15分钟
//   max: 100, // 限制每个IP每15分钟最多100个请求
//   message: {
//     success: false,
//     error: '请求过于频繁，请稍后再试'
//   },
//   standardHeaders: true,
//   legacyHeaders: false,
// });

// app.use('/api/', limiter);

// 健康检查端点（不限流）
app.get('/health', (req, res) => {
  res.json({
    success: true,
    status: 'healthy',
    timestamp: new Date().toISOString(),
    uptime: process.uptime(),
    memory: process.memoryUsage(),
    version: process.env.npm_package_version || '1.0.0'
  });
});

// API路由
app.use('/api/download', downloadRoutes);

// 根路径信息
app.get('/', (req, res) => {
  res.json({
    success: true,
    name: 'Download Service API',
    version: process.env.npm_package_version || '1.0.0',
    description: '文件下载队列服务',
    endpoints: {
      'POST /api/download/add': '添加下载任务',
      'GET /api/download/queue': '获取队列状态',
      'GET /api/download/status/:id': '获取任务状态',
      'DELETE /api/download/:id': '删除任务',
      'POST /api/download/:id/cancel': '取消任务',
      'POST /api/download/:id/retry': '重试任务',
      'GET /api/download/history': '获取下载历史',
      'POST /api/download/cleanup': '清理历史任务',
      'GET /api/download/stats': '获取服务统计',
      'GET /api/download/health': '服务健康检查',
      'GET /health': '基础健康检查'
    },
    documentation: 'https://github.com/your-repo/download-service#api-documentation'
  });
});

// 404处理
app.use(notFoundHandler);

// 错误处理
app.use(errorHandler);

// 启动服务器 - 优先级：命令行参数 > 环境变量 > 默认值
const PORT = cmdArgs.port || process.env.PORT || 8870;
const HOST = cmdArgs.host || process.env.HOST || '127.0.0.1';
const DOWNLOAD_DIR = cmdArgs.downloadDir || process.env.DOWNLOAD_DIR || null;
const ZLIB_COOKIE = cmdArgs.cookie || process.env.ZLIB_COOKIE || null;

// 设置全局配置供其他模块使用
global.APP_CONFIG = {
  DOWNLOAD_DIR,
  ZLIB_COOKIE
};

// 显示配置信息
console.log('⚙️  服务配置:');
console.log(`   端口: ${PORT} ${cmdArgs.port ? '(命令行)' : process.env.PORT ? '(环境变量)' : '(默认)'}`);
console.log(`   主机: ${HOST} ${cmdArgs.host ? '(命令行)' : process.env.HOST ? '(环境变量)' : '(默认)'}`);

if (DOWNLOAD_DIR) {
  console.log(`   下载目录: ${DOWNLOAD_DIR} ${cmdArgs.downloadDir ? '(命令行)' : '(环境变量)'}`);
} else {
  console.log(`   下载目录: ./storage/downloads (默认)`);
}

if (ZLIB_COOKIE) {
  const cookiePreview = ZLIB_COOKIE.length > 50 ? ZLIB_COOKIE.substring(0, 50) + '...' : ZLIB_COOKIE;
  console.log(`   Cookie: ${cookiePreview} ${cmdArgs.cookie ? '(命令行)' : '(环境变量)'}`);
} else {
  console.log(`   Cookie: 使用默认Cookie (默认)`);
}
console.log('');

const server = app.listen(PORT, HOST, () => {
  logger.info(`🚀 下载服务API启动成功`);
  logger.info(`📍 服务地址: http://${HOST}:${PORT}`);
  logger.info(`🌟 环境: ${process.env.NODE_ENV || 'development'}`);

  console.log('');
  console.log('='.repeat(50));
  console.log('🎯 Download Service API 已启动');
  console.log(`📍 地址: http://${HOST}:${PORT}`);
  console.log(`📖 API文档: http://${HOST}:${PORT}/`);
  console.log(`💊 健康检查: http://${HOST}:${PORT}/health`);
  console.log('='.repeat(50));
  console.log('');
});

// 优雅关闭
const gracefulShutdown = (signal) => {
  console.log(`\n收到 ${signal} 信号，正在优雅关闭服务器...`);

  server.close((err) => {
    if (err) {
      logger.error('服务器关闭时发生错误', { error: err.message });
      process.exit(1);
    }

    logger.info('服务器已优雅关闭');
    console.log('✅ 服务器已安全关闭');
    process.exit(0);
  });

  // 如果10秒内没有关闭，强制退出
  setTimeout(() => {
    logger.error('强制关闭服务器');
    console.log('❌ 强制关闭服务器');
    process.exit(1);
  }, 10000);
};

// 监听关闭信号
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
process.on('SIGINT', () => gracefulShutdown('SIGINT'));

// 未捕获的异常处理
process.on('uncaughtException', (err) => {
  logger.error('未捕获的异常', {
    error: err.message,
    stack: err.stack
  });
  console.error('💥 未捕获的异常:', err);
  gracefulShutdown('uncaughtException');
});

// 未处理的Promise拒绝
process.on('unhandledRejection', (reason, promise) => {
  logger.error('未处理的Promise拒绝', {
    reason: reason?.message || reason,
    promise: promise.toString()
  });
  console.error('💥 未处理的Promise拒绝:', reason);
  gracefulShutdown('unhandledRejection');
});

module.exports = app;
